Note:
-An R Notebook is an R Markdown document with chunks that can be executed independently and interactively, with output visible immediately beneath the input.
-Notebook output are available as HTML, PDF, Word, or Latex.
-This Notebook as HTML is preferably open with Google Chrome.
-R-Code can be extracted as Rmd file under the button “Code” in the notebook.
-This Notebook using iterative development. It means the process starts with a simple implementation of a small set of idea requirements and iteratively enhances the evolving versions until the complete version is implemented and perfect.

Overview
What is Business Intelligence
- The term Business Intelligence (BI) refers to technologies, applications and practices for the collection, integration, analysis, and presentation of business information. The purpose of Business Intelligence is to support better business decision making.
- Essentially, Business Intelligence systems are data-driven Decision Support Systems (DSS). Business Intelligence is sometimes used interchangeably with briefing books, report and query tools and executive information systems.
- Business intelligence (BI) combines business analytics, data mining, data visualization, data tools and infrastructure, and best practices to help organizations to make more data-driven decisions.
Self-service business intelligence (SSBI) involves the business systems and data analytics that give business end-users access to an organization’s information without direct IT involvement. Self-service Business intelligence gives end-users the ability to do more with their data without necessarily having technical skills. These solutions are usually created to be flexible and easy-to-use so that end-users can analyze data, make decisions, plan and forecast on their own.


Over the past few years, business intelligence has evolved to include more processes and activities to help improve performance. These processes include:
- Data mining: Using databases, statistics and machine learning to uncover trends in large datasets.
- Reporting: Sharing data analysis to stakeholders so they can draw conclusions and make decisions.
- Performance metrics and benchmarking: Comparing current performance data to historical data to track performance against goals, typically using customized dashboards.
- Descriptive analytics: Using preliminary data analysis to find out what happened.
- Querying: Asking the data specific questions, BI pulling the answers from the datasets.
- Statistical analysis: Taking the results from descriptive analytics and further exploring the data using statistics such as how this trend happened and why.
- Data visualization: Turning data analysis into visual representations such as charts, graphs, and histograms to more easily consume data.
- Visual analysis: Exploring data through visual storytelling to communicate insights on the fly and stay in the flow of analysis.
- Data preparation: Compiling multiple data sources, identifying the dimensions and measurements, preparing it for data analysis.
Why is business intelligence important?
- Business intelligence can help companies make better decisions by showing present and historical data within their business context.
- Analysts can leverage BI to provide performance and competitor benchmarks to make the organization run smoother and more efficiently.
- Analysts can also more easily spot market trends to increase sales or revenue. Used effectively, the right data can help with anything from compliance to hiring efforts.
A few ways that business intelligence can help companies make smarter, data-driven decisions:
- Identify ways to increase profit
- Analyze customer behavior
- Compare data with competitors
- Track performance
- Optimize operations
- Predict success
- Spot market trends
- Discover issues or problems
How business intelligence works
Businesses and organizations have questions and goals. To answer these questions and track performance against these goals, they gather the necessary data, analyze it, and determine which actions to take to reach their goals.

How BI, data analytics, and business analytics work together
Business intelligence includes data analytics and business analytics, but uses them only as parts of the whole process. BI helps users draw conclusions from data analysis. Data scientists dig into the specifics of data, using advanced statistics and predictive analytics to discover patterns and forecast future patterns. Data analytics asks “Why did this happen and what can happen next?” Business intelligence takes those models and algorithms and breaks the results down into actionable language.
According to Gartner's IT glossary, “business analytics includes data mining, predictive analytics, applied analytics, and statistics.” In short, organizations conduct business analytics as part of their larger business intelligence strategy. BI is designed to answer specific queries and provide at-a-glance analysis for decisions or planning. However, companies can use the processes of analytics to continually improve follow-up questions and iteration.
Business analytics shouldn’t be a linear process because answering one question will likely lead to follow-up questions and iteration. Rather, think of the process as a cycle of data access, discovery, exploration, and information sharing. This is called the cycle of analytics, a modern term explaining how businesses use analytics to react to changing questions and expectations.
The difference between traditional BI and modern BI
Historically, business intelligence tools were based on a traditional business intelligence model. This was a top-down approach where business intelligence was driven by the IT organization and most, if not all, analytics questions were answered through static reports.
This meant that if someone had a follow-up question about the report they received, their request would go to the bottom of the reporting queue and they would have to start the process over again. This led to slow, frustrating reporting cycles and people weren’t able to leverage current data to make decisions. Traditional business intelligence is still a common approach for regular reporting and answering static queries.
However, modern business intelligence is interactive and approachable. While IT departments are still an important part of managing access to data, multiple levels of users can customize dashboards and create reports on little notice. With the proper software, users are empowered to visualize data and answer their own questions.
Business intelligence tools and platforms

Overview of SQL – Structured Query Language
- SQL (pronounced “ess-que-el”) stands for Structured Query Language. SQL is used to communicate with a database.

Overview of Star Schema
- What is star schema? The star schema architecture is the simplest data warehouse schema. It is called a star schema because the diagram resembles a star. The center of the star consists of fact table and the points of the star are the dimension tables.
- Fact Tables: A fact table typically has two types of columns: foreign keys to dimension tables and measures those that contain numeric facts. A fact table can contain fact’s data on detail or aggregated level.
- Dimension Tables: A dimension is a structure usually composed of one or more hierarchies that categorizes data. If a dimension hasn’t got a hierarchies and levels it is called flat dimension or list. The primary keys of each of the dimension tables are part of the composite primary key of the fact table.
Typical fact tables store data about sales while dimension tables data about geographic region(markets, cities) , clients, products, times, channels.
The main characteristics of star schema:
- Simple structure -> easy to understand schema
- Great query effectives -> small number of tables to join
- Relatively long time of loading data into dimension tables -> de-normalization, redundancy data caused that size of the table could be large.
- The most commonly used in the data warehouse implementations -> widely supported by a large number of business intelligence tools.

Overview of Snow flake schema
A Snowflake Schema is an extension of a Star Schema, and it adds additional dimensions. It is called snowflake because its diagram resembles a Snowflake.
The dimension tables are normalized which splits data into additional tables. In the following example, Country is further normalized into an individual table.
Characteristics of Snowflake Schema:
- The main benefit of the snowflake schema it uses smaller disk space.
- Easier to implement a dimension is added to the Schema
- Due to multiple tables query performance is reduced
- The primary challenge that you will face while using the snowflake Schema is that you need to perform more maintenance efforts because of the more lookup tables.

Star schema vs Snow Flake schema

What is a Galaxy schema?
A Galaxy Schema contains two fact table that shares dimension tables. It is also called Fact Constellation Schema. The schema is viewed as a collection of stars hence the name Galaxy Schema.

Characteristics of Galaxy Schema:
- The dimensions in this schema are separated into separate dimensions based on the various levels of hierarchy.
- For example, if geography has four levels of hierarchy like region, country, state, and city then Galaxy schema should have four dimensions.
- Moreover, it is possible to build this type of schema by splitting the one-star schema into more Star schemes.
- The dimensions are large in this schema which is needed to build based on the levels of hierarchy.
- This schema is helpful for aggregating fact tables for better understanding.
Introduction Tableau
- Tableau is a powerful and fastest growing data visualization tool used in the Business Intelligence Industry. It helps in simplifying raw data into the very easily understandable format.
- Tableau is a Business Intelligence tool for visually analyzing the data. Users can create and distribute an interactive and shareable dashboard, which depict the trends, variations, and density of the data in the form of graphs and charts. Tableau can connect to files, relational and Big Data sources to acquire and process data. The software allows data blending and real-time collaboration, which makes it very unique. It is used by businesses, academic researchers, and many government organizations for visual data analysis.
Data analysis is very fast with Tableau and the visualizations created are in the form of dashboards and worksheets. The data that is created using Tableau can be understood by professional at any level in an organization. It even allows a non-technical user to create a customized dashboard.
The best feature Tableau are:
- Data Blending
- Real time analysis
- Collaboration of data
The great thing about Tableau software is that it doesn’t require any technical or any kind of programming skills to operate. The tool has garnered interest among the people from all sectors such as business, researchers, different industries, etc.
Tableau Product Suite
The Tableau Product Suite consists of
- Tableau Desktop
- Tableau Public
- Tableau Online
- Tableau Server
- Tableau Reader

For clear understanding, data analytics in tableau can be classified into two fucntion:
- Developer Tools: The Tableau tools that are used for development such as the creation of dashboards, charts, report generation, visualization fall into this category. The Tableau products, under this category, are the Tableau Desktop and the Tableau Public.
- Sharing Tools: As the name suggests, the purpose of the tool is sharing the visualizations, reports, dashboards that were created using the developer tools. Products that fall into this category are Tableau Online, Server, and Reader.
Let’s compared all the products one by one.


How does Tableau work?
- Tableau connects and extracts the data stored in various places. It can pull data from any platform imaginable. A simple database such as an excel, pdf, to a complex database like Oracle, a database in the cloud such as Amazon webs services, Microsoft Azure SQL database, Google Cloud SQL and various other data sources can be extracted by Tableau.
- When Tableau is launched, ready data connectors are available which allows you to connect to any database. Depending on the version of Tableau that you have purchased the number of data connectors supported by Tableau will vary.
- The pulled data can be either connected live or extracted to the Tableau’s data engine, Tableau Desktop. This is where the Data analyst, data engineer work with the data that was pulled up and develop visualizations. The created dashboards are shared with the users as a static file. The users who receive the dashboards views the file using Tableau Reader.
- The data from the Tableau Desktop can be published to the Tableau server. This is an enterprise platform where collaboration, distribution, governance, security model, automation features are supported. With the Tableau server, the end users have a better experience in accessing the files from all locations be it a desktop, mobile or email.


Excel Vs. Tableau
Both Excel and Tableau are data analysis tools, but each tool has its unique approach to data exploration. However, the analysis in Tableau is more potent than excel.
Excel works with rows and columns in spreadsheets whereas Tableau enables in exploring excel data using its drag and drop feature. Tableau formats the data in Graphs, pictures that are easily understandable.
To conclude, Tableau beats Excel in major areas like the interactive dashboards, visualizations, capabilities to work with large-scale data and many more.

Tableau Public vs Tableau Desktop
- Tableau Public (Free)
- Tableau Desktop (Commercial)
Tableau is available in 2 versions. Here is a detailed comparison between the two

Install Tableau Public (Free)
Step 1) Go to https://public.tableau.com/en-us/s/download on your web browser. Now you need to enter your email id and click on “DOWNLOAD THE APP” button.

Step 2) This will start downloading the .exe file for Windows by default, and you can see the downloading process in the bottom left corner of the website.

Step 3) Open the downloaded file. Accept the terms and conditions and click on “Install” button.

Step 4) After installation Start Screen of Tableau is shown

How-to Tutorial
1. Tableau Public Overview
Learn the basics of creating visualizations with Tableau Public.
Covers:
- Connecting to data
- Creating Sheets and Dashboards
- Publishing to the web
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

2. Connecting to Excel and Text Files
Learn how to connect to data in Microsoft Excel and CSV files.
Covers:
- Connecting to data in Excel
- Connecting to data in CSVs
Excel Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
CSV Data: https://support.spatialkey.com/spatialkey-sample-csv-data/
Result:


3. Connecting to Google Sheets
See how to connect to data in Google Sheets, and how to enable auto-update on your viz.
Covers:
- Connecting to data in Google Sheets
- Enabling Google Sheets viz auto-update
Google Sheet Data: https://docs.google.com/spreadsheets/d/1wtyaUAeN2ztSfAo8SK0FtZ0n85K0YBPo_ZcH6Hy54Nw/edit?usp=sharing
Result:

4. Connecting to Web Data Connectors
Learn how to connect to Web Data Connectors.
Covers:
- What a Web Data Connector is
- How to connect to Web Data Connectors
You can use a web data connector to connect to data that is accessible over HTTP and that doesn’t already have a connector. A web data connector is an HTML file that includes JavaScript code. You can create your own web data connector or use one that has been created by someone else. The web data connector must be hosted on a web server running locally on your computer, on a web server in your domain, or on a third-party web server.
Source: http://tableau.github.io/webdataconnector/
WDC Data: https://tableau.github.io/webdataconnector/Examples/html/earthquakeUSGS.html
Result:

5. Connecting to Spatial Files
See how to build maps with spatial files.
Covers:
- How to connect to spatial data-> XML or geojson
- Create a map with a spatial file
- How to join other data sets to a spatial file
Dataset:
Step by step:
Choose the wribasin.shp
Choose the London_Borough_Excluding_MHW.shp<[GSS Code]-[Code]>carbon-emissions-borough.xlx
Result:


6. Connecting to PDFs
Learn how to connect to data in PDFs directly in Tableau.
Covers:
- Connecting to PDF data tables
- Union
- Cleaning up imperfect tables
- Dealing with null values
- Fixing headers and pivoting
- Re-aliasing members of a field
- Recreating Groups and Hierarchies
- Tips on working with PDFs
Dataset:
Amazon Stock Prices: https://public.tableau.com/s/sites/default/files/media/amzn_stock.pdf
New Zealand Water Physical Stock Account: https://public.tableau.com/s/sites/default/files/media/nz_water_0.pdf
Result:

7. Data Preparation – The Data Interpreter
See Tableau Public’s ideal data structure, and learn how to use the Data Interpreter to clean data.
Covers:
- How your data should (ideally) be structured
- How to clean your data using the Data Interpreter
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

8. Data Preparation – Pivoting your Data
Learn how to pivot your data structure in Tableau.
Covers:
- Why you might need to pivot your data structure
- How to use Tableau Public’s pivot function
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:


9. Data Preparation – Splitting your Data
Learn how to split a field into multiple fields in Tableau
Covers:
- Why you might need to split a field in Tableau Public
- How to use Tableau Public’s split function
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

10. Data Preparation – Joins and Unions
Learn how to join multiple data sets together in Tableau.
Covers:
- What are joins and unions
- How to join two data sets together
- How to union multiple data sets
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:


11. Creating Your First Chart
Find out how to create your first chart in Tableau Public.
Covers:
- How to create a chart by double clicking on fields
- How to add extra levels of information to your viz
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

12. Using the Show Me Tool Bar
Find out how to create multiple visualization types using the Show Me Tool Bar.
Covers:
- The Show Me tool
- Overview of Chart types
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

13. Understanding the Logic of Charts
Learn about the logic of how Tableau Public creates charts.
Covers:
- Overview of Dimensions and Measures
- Overview of Columns and Rows shelf
- Overview of the Marks card
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

14. Combining Sheets on a Dashboard
See how to combine your visualizations together on a dashboard.
Covers:
- How to combine sheets on a dashboard
- How to re-arrange and add items to a dashboard
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

15. Adding Interactivity to Dashboards
Learn how to add interactivity to your dashboards.
Covers:
- See how to add filter actions
- See how to add highlight actions
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

16. Dashboard Formatting
Make your dashboards functional and look fantastic with these formatting tips.
Covers:
- See how to quickly globally format your dashboards
- Tips to add titles and instructions to your dashboard
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

17. Creating Stories
Learn how to turn your data into a cohesive narrative using Story Points.
Covers:
- See examples of data stories
- Learn how to create story points
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

18. Formatting Story Points
Make your stories come to life with these formatting tips.
Covers:
- Learn how to fit your dashboards to the story points
- See how to format the story points
- See how to add annotations to your story
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

19. Designing for Mobile with the Device Designer
Learn how to make your viz look great on any device with the Device Designer feature.
Covers:
- Preview how your viz will look on multiple devices
- How to add a device specific view
- Tips on fitting your viz to device sizes
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

20. Publishing and Embedding Vizzes
Once you have made your viz, see how you can share it.
Covers:
- How to save a viz to the web
- Edit your viz details
- How to use the viz URL and embed codes
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

21. Adding a custom Viz in Tooltip
Learn how to show a different level of detail with the Viz in Tooltip feature.
Covers:
- How to create a viz in tooltip
- Resizing your viz in tooltip
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

22. Edit Vizzes on the Web
Once you have saved a viz to your profile, see how you can edit from your browser.
Covers:
- Create a new sheet from a browser
- Create a calculated field from a browser
- Edit a dashboard from your browser
Data: https://data.worldbank.org/indicator/EN.ATM.CO2E.PC
Result:

Change log update
- 07.10.2019
- 08.10.2019
- 09.10.2019
- 10.10.2019
LS0tDQp0aXRsZTogIlRhYmxlYXUgUHVibGljIg0Kc3VidGl0bGU6ICJEYXRhIExhYiINCmF1dGhvcjogIkNldmkgSGVyZGlhbiwgTS4gU2MsIFNGQyAoaXRzbWVjZXZpLmdpdGh1Yi5pbykiDQpkYXRlOiAiMTAuMTAuMjAxOSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IGNvc21vDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNScNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNScNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzUnDQotLS0NCg0KDQoqKk5vdGU6KioNCg0KLUFuIFIgTm90ZWJvb2sgaXMgYW4gUiBNYXJrZG93biBkb2N1bWVudCB3aXRoIGNodW5rcyB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbmRlcGVuZGVudGx5IGFuZCBpbnRlcmFjdGl2ZWx5LCB3aXRoIG91dHB1dCB2aXNpYmxlIGltbWVkaWF0ZWx5IGJlbmVhdGggdGhlIGlucHV0Lg0KDQotTm90ZWJvb2sgb3V0cHV0IGFyZSBhdmFpbGFibGUgYXMgSFRNTCwgUERGLCBXb3JkLCBvciBMYXRleC4gDQoNCi1UaGlzIE5vdGVib29rIGFzIEhUTUwgaXMgcHJlZmVyYWJseSBvcGVuIHdpdGggR29vZ2xlIENocm9tZS4NCg0KLVItQ29kZSBjYW4gYmUgZXh0cmFjdGVkIGFzIFJtZCBmaWxlIHVuZGVyIHRoZSBidXR0b24gIkNvZGUiIGluIHRoZSBub3RlYm9vay4NCg0KLVRoaXMgTm90ZWJvb2sgdXNpbmcgaXRlcmF0aXZlIGRldmVsb3BtZW50LiBJdCBtZWFucyB0aGUgcHJvY2VzcyBzdGFydHMgd2l0aCBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNtYWxsIHNldCBvZiBpZGVhIHJlcXVpcmVtZW50cyBhbmQgaXRlcmF0aXZlbHkgZW5oYW5jZXMgdGhlIGV2b2x2aW5nIHZlcnNpb25zIHVudGlsIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIGlzIGltcGxlbWVudGVkIGFuZCBwZXJmZWN0Lg0KDQoNCg0KIVtdKHRhYmxlYXUucG5nKQ0KDQoNCjxCcj4NCg0KDQoNCiMgT3ZlcnZpZXcNCg0KX19XaGF0IGlzIEJ1c2luZXNzIEludGVsbGlnZW5jZV9fDQoNCiogVGhlIHRlcm0gQnVzaW5lc3MgSW50ZWxsaWdlbmNlIChCSSkgcmVmZXJzIHRvIF9fdGVjaG5vbG9naWVzX18sIF9fYXBwbGljYXRpb25zX18gYW5kIF9fcHJhY3RpY2VzX18gZm9yIHRoZSBjb2xsZWN0aW9uLCBpbnRlZ3JhdGlvbiwgYW5hbHlzaXMsIGFuZCBwcmVzZW50YXRpb24gb2YgYnVzaW5lc3MgaW5mb3JtYXRpb24uIFRoZSBwdXJwb3NlIG9mIEJ1c2luZXNzIEludGVsbGlnZW5jZSBpcyB0byBzdXBwb3J0IGJldHRlciBidXNpbmVzcyBkZWNpc2lvbiBtYWtpbmcuIA0KKiBFc3NlbnRpYWxseSwgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHN5c3RlbXMgYXJlIGRhdGEtZHJpdmVuIERlY2lzaW9uIFN1cHBvcnQgU3lzdGVtcyAoRFNTKS4gQnVzaW5lc3MgSW50ZWxsaWdlbmNlIGlzIHNvbWV0aW1lcyB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGJyaWVmaW5nIGJvb2tzLCByZXBvcnQgYW5kIHF1ZXJ5IHRvb2xzIGFuZCBleGVjdXRpdmUgaW5mb3JtYXRpb24gc3lzdGVtcy4NCiogQnVzaW5lc3MgaW50ZWxsaWdlbmNlIChCSSkgY29tYmluZXMgYnVzaW5lc3MgYW5hbHl0aWNzLCBkYXRhIG1pbmluZywgZGF0YSB2aXN1YWxpemF0aW9uLCBkYXRhIHRvb2xzIGFuZCBpbmZyYXN0cnVjdHVyZSwgYW5kIGJlc3QgcHJhY3RpY2VzIHRvIGhlbHAgb3JnYW5pemF0aW9ucyB0byBtYWtlIG1vcmUgZGF0YS1kcml2ZW4gZGVjaXNpb25zLiANCg0KX19TZWxmLXNlcnZpY2UgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIChTU0JJKV9fIGludm9sdmVzIHRoZSBidXNpbmVzcyBzeXN0ZW1zIGFuZCBkYXRhIGFuYWx5dGljcyB0aGF0IGdpdmUgYnVzaW5lc3MgZW5kLXVzZXJzIGFjY2VzcyB0byBhbiBvcmdhbml6YXRpb27igJlzIGluZm9ybWF0aW9uIHdpdGhvdXQgZGlyZWN0IElUIGludm9sdmVtZW50LiBTZWxmLXNlcnZpY2UgQnVzaW5lc3MgaW50ZWxsaWdlbmNlIGdpdmVzIGVuZC11c2VycyB0aGUgYWJpbGl0eSB0byBkbyBtb3JlIHdpdGggdGhlaXIgZGF0YSB3aXRob3V0IG5lY2Vzc2FyaWx5IGhhdmluZyB0ZWNobmljYWwgc2tpbGxzLiBUaGVzZSBzb2x1dGlvbnMgYXJlIHVzdWFsbHkgY3JlYXRlZCB0byBiZSBmbGV4aWJsZSBhbmQgZWFzeS10by11c2Ugc28gdGhhdCBlbmQtdXNlcnMgY2FuIGFuYWx5emUgZGF0YSwgbWFrZSBkZWNpc2lvbnMsIHBsYW4gYW5kDQpmb3JlY2FzdCBvbiB0aGVpciBvd24uDQoNCg0KDQohW10odHJhZGl0aW9uYWwtQkkuanBnKQ0KDQoNCg0KIVtdKHNzYml2cy5qcGcpDQoNCg0KDQpPdmVyIHRoZSBwYXN0IGZldyB5ZWFycywgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIGhhcyBldm9sdmVkIHRvIGluY2x1ZGUgbW9yZSBwcm9jZXNzZXMgYW5kIGFjdGl2aXRpZXMgdG8gaGVscCBpbXByb3ZlIHBlcmZvcm1hbmNlLiBUaGVzZSBwcm9jZXNzZXMgaW5jbHVkZToNCg0KKiBfX0RhdGEgbWluaW5nX186IFVzaW5nIGRhdGFiYXNlcywgc3RhdGlzdGljcyBhbmQgbWFjaGluZSBsZWFybmluZyB0byB1bmNvdmVyIHRyZW5kcyBpbiBsYXJnZSBkYXRhc2V0cy4NCiogX19SZXBvcnRpbmdfXzogU2hhcmluZyBkYXRhIGFuYWx5c2lzIHRvIHN0YWtlaG9sZGVycyBzbyB0aGV5IGNhbiBkcmF3IGNvbmNsdXNpb25zIGFuZCBtYWtlIGRlY2lzaW9ucy4NCiogX19QZXJmb3JtYW5jZSBtZXRyaWNzIGFuZCBiZW5jaG1hcmtpbmdfXzogQ29tcGFyaW5nIGN1cnJlbnQgcGVyZm9ybWFuY2UgZGF0YSB0byBoaXN0b3JpY2FsIGRhdGEgdG8gdHJhY2sgcGVyZm9ybWFuY2UgYWdhaW5zdCBnb2FscywgdHlwaWNhbGx5IHVzaW5nIGN1c3RvbWl6ZWQgZGFzaGJvYXJkcy4NCiogX19EZXNjcmlwdGl2ZSBhbmFseXRpY3NfXzogVXNpbmcgcHJlbGltaW5hcnkgZGF0YSBhbmFseXNpcyB0byBmaW5kIG91dCB3aGF0IGhhcHBlbmVkLg0KKiBfX1F1ZXJ5aW5nX186IEFza2luZyB0aGUgZGF0YSBzcGVjaWZpYyBxdWVzdGlvbnMsIEJJIHB1bGxpbmcgdGhlIGFuc3dlcnMgZnJvbSB0aGUgZGF0YXNldHMuDQoqIF9fU3RhdGlzdGljYWwgYW5hbHlzaXNfXzogVGFraW5nIHRoZSByZXN1bHRzIGZyb20gZGVzY3JpcHRpdmUgYW5hbHl0aWNzIGFuZCBmdXJ0aGVyIGV4cGxvcmluZyB0aGUgZGF0YSB1c2luZyBzdGF0aXN0aWNzIHN1Y2ggYXMgaG93IHRoaXMgdHJlbmQgaGFwcGVuZWQgYW5kIHdoeS4NCiogX19EYXRhIHZpc3VhbGl6YXRpb25fXzogVHVybmluZyBkYXRhIGFuYWx5c2lzIGludG8gdmlzdWFsIHJlcHJlc2VudGF0aW9ucyBzdWNoIGFzIGNoYXJ0cywgZ3JhcGhzLCBhbmQgaGlzdG9ncmFtcyB0byBtb3JlIGVhc2lseSBjb25zdW1lIGRhdGEuDQoqIF9fVmlzdWFsIGFuYWx5c2lzX186IEV4cGxvcmluZyBkYXRhIHRocm91Z2ggdmlzdWFsIHN0b3J5dGVsbGluZyB0byBjb21tdW5pY2F0ZSBpbnNpZ2h0cyBvbiB0aGUgZmx5IGFuZCBzdGF5IGluIHRoZSBmbG93IG9mIGFuYWx5c2lzLg0KKiBfX0RhdGEgcHJlcGFyYXRpb25fXzogQ29tcGlsaW5nIG11bHRpcGxlIGRhdGEgc291cmNlcywgaWRlbnRpZnlpbmcgdGhlIGRpbWVuc2lvbnMgYW5kIG1lYXN1cmVtZW50cywgcHJlcGFyaW5nIGl0IGZvciBkYXRhIGFuYWx5c2lzLg0KDQoNCl9fV2h5IGlzIGJ1c2luZXNzIGludGVsbGlnZW5jZSBpbXBvcnRhbnQ/X18NCg0KKiAgQnVzaW5lc3MgaW50ZWxsaWdlbmNlIGNhbiBoZWxwIGNvbXBhbmllcyBtYWtlIGJldHRlciBkZWNpc2lvbnMgYnkgc2hvd2luZyBwcmVzZW50IGFuZCBoaXN0b3JpY2FsIGRhdGEgd2l0aGluIHRoZWlyIGJ1c2luZXNzIGNvbnRleHQuDQoqIEFuYWx5c3RzIGNhbiBsZXZlcmFnZSBCSSB0byBwcm92aWRlIHBlcmZvcm1hbmNlIGFuZCBjb21wZXRpdG9yIGJlbmNobWFya3MgdG8gbWFrZSB0aGUgb3JnYW5pemF0aW9uIHJ1biBzbW9vdGhlciBhbmQgbW9yZSBlZmZpY2llbnRseS4gDQoqIEFuYWx5c3RzIGNhbiBhbHNvIG1vcmUgZWFzaWx5IHNwb3QgbWFya2V0IHRyZW5kcyB0byBpbmNyZWFzZSBzYWxlcyBvciByZXZlbnVlLiBVc2VkIGVmZmVjdGl2ZWx5LCB0aGUgcmlnaHQgZGF0YSBjYW4gaGVscCB3aXRoIGFueXRoaW5nIGZyb20gY29tcGxpYW5jZSB0byBoaXJpbmcgZWZmb3J0cy4NCg0KDQpBIGZldyB3YXlzIHRoYXQgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIGNhbiBoZWxwIGNvbXBhbmllcyBtYWtlIHNtYXJ0ZXIsIGRhdGEtZHJpdmVuIGRlY2lzaW9uczoNCg0KKiBJZGVudGlmeSB3YXlzIHRvIGluY3JlYXNlIHByb2ZpdA0KKiBBbmFseXplIGN1c3RvbWVyIGJlaGF2aW9yDQoqIENvbXBhcmUgZGF0YSB3aXRoIGNvbXBldGl0b3JzDQoqIFRyYWNrIHBlcmZvcm1hbmNlDQoqIE9wdGltaXplIG9wZXJhdGlvbnMNCiogUHJlZGljdCBzdWNjZXNzDQoqIFNwb3QgbWFya2V0IHRyZW5kcw0KKiBEaXNjb3ZlciBpc3N1ZXMgb3IgcHJvYmxlbXMNCg0KDQpfX0hvdyBidXNpbmVzcyBpbnRlbGxpZ2VuY2Ugd29ya3NfXw0KDQpCdXNpbmVzc2VzIGFuZCBvcmdhbml6YXRpb25zIGhhdmUgcXVlc3Rpb25zIGFuZCBnb2Fscy4gVG8gYW5zd2VyIHRoZXNlIHF1ZXN0aW9ucyBhbmQgdHJhY2sgcGVyZm9ybWFuY2UgYWdhaW5zdCB0aGVzZSBnb2FscywgdGhleSBnYXRoZXIgdGhlIG5lY2Vzc2FyeSBkYXRhLCBhbmFseXplIGl0LCBhbmQgZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gdGFrZSB0byByZWFjaCB0aGVpciBnb2Fscy4NCg0KDQohW10obW9kZXJuYmkucG5nKQ0KDQoNCg0KX19Ib3cgQkksIGRhdGEgYW5hbHl0aWNzLCBhbmQgYnVzaW5lc3MgYW5hbHl0aWNzIHdvcmsgdG9nZXRoZXJfXw0KDQpCdXNpbmVzcyBpbnRlbGxpZ2VuY2UgaW5jbHVkZXMgZGF0YSBhbmFseXRpY3MgYW5kIGJ1c2luZXNzIGFuYWx5dGljcywgYnV0IHVzZXMgdGhlbSBvbmx5IGFzIHBhcnRzIG9mIHRoZSB3aG9sZSBwcm9jZXNzLiBCSSBoZWxwcyB1c2VycyBkcmF3IGNvbmNsdXNpb25zIGZyb20gZGF0YSBhbmFseXNpcy4gRGF0YSBzY2llbnRpc3RzIGRpZyBpbnRvIHRoZSBzcGVjaWZpY3Mgb2YgZGF0YSwgdXNpbmcgYWR2YW5jZWQgc3RhdGlzdGljcyBhbmQgcHJlZGljdGl2ZSBhbmFseXRpY3MgdG8gZGlzY292ZXIgcGF0dGVybnMgYW5kIGZvcmVjYXN0IGZ1dHVyZSBwYXR0ZXJucy4gRGF0YSBhbmFseXRpY3MgYXNrcyDigJxXaHkgZGlkIHRoaXMgaGFwcGVuIGFuZCB3aGF0IGNhbiBoYXBwZW4gbmV4dD/igJ0gQnVzaW5lc3MgaW50ZWxsaWdlbmNlIHRha2VzIHRob3NlIG1vZGVscyBhbmQgYWxnb3JpdGhtcyBhbmQgYnJlYWtzIHRoZSByZXN1bHRzIGRvd24gaW50byBhY3Rpb25hYmxlIGxhbmd1YWdlLg0KDQpBY2NvcmRpbmcgdG8gYEdhcnRuZXIncyBJVCBnbG9zc2FyeWAsIOKAnGJ1c2luZXNzIGFuYWx5dGljcyBpbmNsdWRlcyBkYXRhIG1pbmluZywgcHJlZGljdGl2ZSBhbmFseXRpY3MsIGFwcGxpZWQgYW5hbHl0aWNzLCBhbmQgc3RhdGlzdGljcy7igJ0gSW4gc2hvcnQsIG9yZ2FuaXphdGlvbnMgY29uZHVjdCBidXNpbmVzcyBhbmFseXRpY3MgYXMgcGFydCBvZiB0aGVpciBsYXJnZXIgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIHN0cmF0ZWd5LiBCSSBpcyBkZXNpZ25lZCB0byBhbnN3ZXIgc3BlY2lmaWMgcXVlcmllcyBhbmQgcHJvdmlkZSBhdC1hLWdsYW5jZSBhbmFseXNpcyBmb3IgZGVjaXNpb25zIG9yIHBsYW5uaW5nLiBIb3dldmVyLCBjb21wYW5pZXMgY2FuIHVzZSB0aGUgcHJvY2Vzc2VzIG9mIGFuYWx5dGljcyB0byBjb250aW51YWxseSBpbXByb3ZlIGZvbGxvdy11cCBxdWVzdGlvbnMgYW5kIGl0ZXJhdGlvbi4NCg0KDQpCdXNpbmVzcyBhbmFseXRpY3Mgc2hvdWxkbuKAmXQgYmUgYSBsaW5lYXIgcHJvY2VzcyBiZWNhdXNlIGFuc3dlcmluZyBvbmUgcXVlc3Rpb24gd2lsbCBsaWtlbHkgbGVhZCB0byBmb2xsb3ctdXAgcXVlc3Rpb25zIGFuZCBpdGVyYXRpb24uIFJhdGhlciwgdGhpbmsgb2YgdGhlIHByb2Nlc3MgYXMgYSBjeWNsZSBvZiBkYXRhIGFjY2VzcywgZGlzY292ZXJ5LCBleHBsb3JhdGlvbiwgYW5kIGluZm9ybWF0aW9uIHNoYXJpbmcuIFRoaXMgaXMgY2FsbGVkIHRoZSBjeWNsZSBvZiBhbmFseXRpY3MsIGEgbW9kZXJuIHRlcm0gZXhwbGFpbmluZyBob3cgYnVzaW5lc3NlcyB1c2UgYW5hbHl0aWNzIHRvIHJlYWN0IHRvIGNoYW5naW5nIHF1ZXN0aW9ucyBhbmQgZXhwZWN0YXRpb25zLg0KDQoNCl9fVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0cmFkaXRpb25hbCBCSSBhbmQgbW9kZXJuIEJJX18NCg0KSGlzdG9yaWNhbGx5LCBidXNpbmVzcyBpbnRlbGxpZ2VuY2UgdG9vbHMgd2VyZSBiYXNlZCBvbiBhIHRyYWRpdGlvbmFsIGJ1c2luZXNzIGludGVsbGlnZW5jZSBtb2RlbC4gVGhpcyB3YXMgYSB0b3AtZG93biBhcHByb2FjaCB3aGVyZSBidXNpbmVzcyBpbnRlbGxpZ2VuY2Ugd2FzIGRyaXZlbiBieSB0aGUgSVQgb3JnYW5pemF0aW9uIGFuZCBtb3N0LCBpZiBub3QgYWxsLCBhbmFseXRpY3MgcXVlc3Rpb25zIHdlcmUgYW5zd2VyZWQgdGhyb3VnaCBzdGF0aWMgcmVwb3J0cy4NCg0KVGhpcyBtZWFudCB0aGF0IGlmIHNvbWVvbmUgaGFkIGEgZm9sbG93LXVwIHF1ZXN0aW9uIGFib3V0IHRoZSByZXBvcnQgdGhleSByZWNlaXZlZCwgdGhlaXIgcmVxdWVzdCB3b3VsZCBnbyB0byB0aGUgYm90dG9tIG9mIHRoZSByZXBvcnRpbmcgcXVldWUgYW5kIHRoZXkgd291bGQgaGF2ZSB0byBzdGFydCB0aGUgcHJvY2VzcyBvdmVyIGFnYWluLiBUaGlzIGxlZCB0byBzbG93LCBmcnVzdHJhdGluZyByZXBvcnRpbmcgY3ljbGVzIGFuZCBwZW9wbGUgd2VyZW7igJl0IGFibGUgdG8gbGV2ZXJhZ2UgY3VycmVudCBkYXRhIHRvIG1ha2UgZGVjaXNpb25zLiBUcmFkaXRpb25hbCBidXNpbmVzcyBpbnRlbGxpZ2VuY2UgaXMgc3RpbGwgYSBjb21tb24gYXBwcm9hY2ggZm9yIHJlZ3VsYXIgcmVwb3J0aW5nIGFuZCBhbnN3ZXJpbmcgc3RhdGljIHF1ZXJpZXMuDQoNCl9fSG93ZXZlciwgbW9kZXJuIGJ1c2luZXNzIGludGVsbGlnZW5jZSBpcyBpbnRlcmFjdGl2ZSBhbmQgYXBwcm9hY2hhYmxlX18uIFdoaWxlIElUIGRlcGFydG1lbnRzIGFyZSBzdGlsbCBhbiBpbXBvcnRhbnQgcGFydCBvZiBtYW5hZ2luZyBhY2Nlc3MgdG8gZGF0YSwgbXVsdGlwbGUgbGV2ZWxzIG9mIHVzZXJzIGNhbiBjdXN0b21pemUgZGFzaGJvYXJkcyBhbmQgY3JlYXRlIHJlcG9ydHMgb24gbGl0dGxlIG5vdGljZS4gV2l0aCB0aGUgcHJvcGVyIHNvZnR3YXJlLCB1c2VycyBhcmUgZW1wb3dlcmVkIHRvIHZpc3VhbGl6ZSBkYXRhIGFuZCBhbnN3ZXIgdGhlaXIgb3duIHF1ZXN0aW9ucy4NCg0KDQpfX0J1c2luZXNzIGludGVsbGlnZW5jZSB0b29scyBhbmQgcGxhdGZvcm1zX18NCg0KIVtdKGdhcnRuZXJiaS5wbmcpDQoNCg0KX19PdmVydmlldyBvZiBTUUwg4oCTIFN0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2VfXw0KDQoqIFNRTCAocHJvbm91bmNlZCAiZXNzLXF1ZS1lbCIpIHN0YW5kcyBmb3IgU3RydWN0dXJlZCBRdWVyeSBMYW5ndWFnZS4gU1FMIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIGRhdGFiYXNlLiANCg0KIVtdKHNxbC5wbmcpDQoNCl9fT3ZlcnZpZXcgb2YgU3RhciBTY2hlbWFfXw0KDQoqIFdoYXQgaXMgc3RhciBzY2hlbWE/IFRoZSBzdGFyIHNjaGVtYSBhcmNoaXRlY3R1cmUgaXMgdGhlIHNpbXBsZXN0IGRhdGEgd2FyZWhvdXNlIHNjaGVtYS4gSXQgaXMgY2FsbGVkIGEgc3RhciBzY2hlbWEgYmVjYXVzZSB0aGUgZGlhZ3JhbSByZXNlbWJsZXMgYSBzdGFyLiBUaGUgY2VudGVyIG9mIHRoZSBzdGFyIGNvbnNpc3RzIG9mIGZhY3QgdGFibGUgYW5kIHRoZSBwb2ludHMgb2YgdGhlIHN0YXIgYXJlIHRoZSBkaW1lbnNpb24gdGFibGVzLiANCiogRmFjdCBUYWJsZXM6IEEgZmFjdCB0YWJsZSB0eXBpY2FsbHkgaGFzIHR3byB0eXBlcyBvZiBjb2x1bW5zOiBmb3JlaWduIGtleXMgdG8gZGltZW5zaW9uIHRhYmxlcyBhbmQgbWVhc3VyZXMgdGhvc2UgdGhhdCBjb250YWluIG51bWVyaWMgZmFjdHMuIEEgZmFjdCB0YWJsZSBjYW4gY29udGFpbiBmYWN0J3MgZGF0YSBvbiBkZXRhaWwgb3IgYWdncmVnYXRlZCBsZXZlbC4NCiogRGltZW5zaW9uIFRhYmxlczogQSBkaW1lbnNpb24gaXMgYSBzdHJ1Y3R1cmUgdXN1YWxseSBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBoaWVyYXJjaGllcyB0aGF0IGNhdGVnb3JpemVzIGRhdGEuIElmIGEgZGltZW5zaW9uIGhhc24ndCBnb3QgYSBoaWVyYXJjaGllcyBhbmQgbGV2ZWxzIGl0IGlzIGNhbGxlZCBmbGF0IGRpbWVuc2lvbiBvciBsaXN0LiBUaGUgcHJpbWFyeSBrZXlzIG9mIGVhY2ggb2YgdGhlIGRpbWVuc2lvbiB0YWJsZXMgYXJlIHBhcnQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBvZiB0aGUgZmFjdCB0YWJsZS4NCg0KDQpUeXBpY2FsIGZhY3QgdGFibGVzIHN0b3JlIGRhdGEgYWJvdXQgc2FsZXMgd2hpbGUgZGltZW5zaW9uIHRhYmxlcyBkYXRhIGFib3V0IGdlb2dyYXBoaWMgcmVnaW9uKG1hcmtldHMsIGNpdGllcykgLCBjbGllbnRzLCBwcm9kdWN0cywgdGltZXMsIGNoYW5uZWxzLg0KDQoNClRoZSBtYWluIGNoYXJhY3RlcmlzdGljcyBvZiBzdGFyIHNjaGVtYToNCg0KDQoqIFNpbXBsZSBzdHJ1Y3R1cmUgLT4gZWFzeSB0byB1bmRlcnN0YW5kIHNjaGVtYQ0KKiBHcmVhdCBxdWVyeSBlZmZlY3RpdmVzIC0+IHNtYWxsIG51bWJlciBvZiB0YWJsZXMgdG8gam9pbg0KKiBSZWxhdGl2ZWx5IGxvbmcgdGltZSBvZiBsb2FkaW5nIGRhdGEgaW50byBkaW1lbnNpb24gdGFibGVzIC0+IGRlLW5vcm1hbGl6YXRpb24sIHJlZHVuZGFuY3kgZGF0YSBjYXVzZWQgdGhhdCBzaXplIG9mIHRoZSB0YWJsZSBjb3VsZCBiZSBsYXJnZS4NCiogVGhlIG1vc3QgY29tbW9ubHkgdXNlZCBpbiB0aGUgZGF0YSB3YXJlaG91c2UgaW1wbGVtZW50YXRpb25zIC0+IHdpZGVseSBzdXBwb3J0ZWQgYnkgYSBsYXJnZSBudW1iZXIgb2YgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIHRvb2xzLg0KDQohW10oc3RhcnNjaGVtYS5wbmcpDQoNCl9fT3ZlcnZpZXcgb2YgU25vdyBmbGFrZSBzY2hlbWFfXw0KDQoqIEEgU25vd2ZsYWtlIFNjaGVtYSBpcyBhbiBleHRlbnNpb24gb2YgYSBTdGFyIFNjaGVtYSwgYW5kIGl0IGFkZHMgYWRkaXRpb25hbCBkaW1lbnNpb25zLiBJdCBpcyBjYWxsZWQgc25vd2ZsYWtlIGJlY2F1c2UgaXRzIGRpYWdyYW0gcmVzZW1ibGVzIGEgU25vd2ZsYWtlLiANCg0KKiBUaGUgZGltZW5zaW9uIHRhYmxlcyBhcmUgbm9ybWFsaXplZCB3aGljaCBzcGxpdHMgZGF0YSBpbnRvIGFkZGl0aW9uYWwgdGFibGVzLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIENvdW50cnkgaXMgZnVydGhlciBub3JtYWxpemVkIGludG8gYW4gaW5kaXZpZHVhbCB0YWJsZS4NCg0KDQpDaGFyYWN0ZXJpc3RpY3Mgb2YgU25vd2ZsYWtlIFNjaGVtYToNCg0KKiBUaGUgbWFpbiBiZW5lZml0IG9mIHRoZSBzbm93Zmxha2Ugc2NoZW1hIGl0IHVzZXMgc21hbGxlciBkaXNrIHNwYWNlLg0KKiBFYXNpZXIgdG8gaW1wbGVtZW50IGEgZGltZW5zaW9uIGlzIGFkZGVkIHRvIHRoZSBTY2hlbWENCiogRHVlIHRvIG11bHRpcGxlIHRhYmxlcyBxdWVyeSBwZXJmb3JtYW5jZSBpcyByZWR1Y2VkDQoqIFRoZSBwcmltYXJ5IGNoYWxsZW5nZSB0aGF0IHlvdSB3aWxsIGZhY2Ugd2hpbGUgdXNpbmcgdGhlIHNub3dmbGFrZSBTY2hlbWEgaXMgdGhhdCB5b3UgbmVlZCB0byBwZXJmb3JtIG1vcmUgbWFpbnRlbmFuY2UgZWZmb3J0cyBiZWNhdXNlIG9mIHRoZSBtb3JlIGxvb2t1cCB0YWJsZXMuDQoNCiFbXShzbm93Zmxha2UucG5nKQ0KDQoNCl9fU3RhciBzY2hlbWEgdnMgU25vdyBGbGFrZSBzY2hlbWFfXw0KDQohW10oc3RhcnZzc25vdy5QTkcpDQoNCg0KDQoNCg0KX19XaGF0IGlzIGEgR2FsYXh5IHNjaGVtYT9fXw0KDQpBIEdhbGF4eSBTY2hlbWEgY29udGFpbnMgdHdvIGZhY3QgdGFibGUgdGhhdCBzaGFyZXMgZGltZW5zaW9uIHRhYmxlcy4gSXQgaXMgYWxzbyBjYWxsZWQgRmFjdCBDb25zdGVsbGF0aW9uIFNjaGVtYS4gVGhlIHNjaGVtYSBpcyB2aWV3ZWQgYXMgYSBjb2xsZWN0aW9uIG9mIHN0YXJzIGhlbmNlIHRoZSBuYW1lIEdhbGF4eSBTY2hlbWEuDQoNCg0KIVtdKGdhbGF4eS5wbmcpDQoNCg0KDQpDaGFyYWN0ZXJpc3RpY3Mgb2YgR2FsYXh5IFNjaGVtYToNCg0KKiBUaGUgZGltZW5zaW9ucyBpbiB0aGlzIHNjaGVtYSBhcmUgc2VwYXJhdGVkIGludG8gc2VwYXJhdGUgZGltZW5zaW9ucyBiYXNlZCBvbiB0aGUgdmFyaW91cyBsZXZlbHMgb2YgaGllcmFyY2h5Lg0KKiBGb3IgZXhhbXBsZSwgaWYgZ2VvZ3JhcGh5IGhhcyBmb3VyIGxldmVscyBvZiBoaWVyYXJjaHkgbGlrZSByZWdpb24sIGNvdW50cnksIHN0YXRlLCBhbmQgY2l0eSB0aGVuIEdhbGF4eSBzY2hlbWEgc2hvdWxkIGhhdmUgZm91ciBkaW1lbnNpb25zLg0KKiBNb3Jlb3ZlciwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdGhpcyB0eXBlIG9mIHNjaGVtYSBieSBzcGxpdHRpbmcgdGhlIG9uZS1zdGFyIHNjaGVtYSBpbnRvIG1vcmUgU3RhciBzY2hlbWVzLg0KKiBUaGUgZGltZW5zaW9ucyBhcmUgbGFyZ2UgaW4gdGhpcyBzY2hlbWEgd2hpY2ggaXMgbmVlZGVkIHRvIGJ1aWxkIGJhc2VkIG9uIHRoZSBsZXZlbHMgb2YgaGllcmFyY2h5Lg0KKiBUaGlzIHNjaGVtYSBpcyBoZWxwZnVsIGZvciBhZ2dyZWdhdGluZyBmYWN0IHRhYmxlcyBmb3IgYmV0dGVyIHVuZGVyc3RhbmRpbmcuDQoNCg0KDQoNCjxCcj4NCg0KIyBJbnRyb2R1Y3Rpb24gVGFibGVhdQ0KDQoqIFRhYmxlYXUgaXMgYSBwb3dlcmZ1bCBhbmQgZmFzdGVzdCBncm93aW5nIGRhdGEgdmlzdWFsaXphdGlvbiB0b29sIHVzZWQgaW4gdGhlIEJ1c2luZXNzIEludGVsbGlnZW5jZSBJbmR1c3RyeS4gSXQgaGVscHMgaW4gc2ltcGxpZnlpbmcgcmF3IGRhdGEgaW50byB0aGUgdmVyeSBlYXNpbHkgdW5kZXJzdGFuZGFibGUgZm9ybWF0Lg0KKiBUYWJsZWF1IGlzIGEgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHRvb2wgZm9yIHZpc3VhbGx5IGFuYWx5emluZyB0aGUgZGF0YS4gVXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGlzdHJpYnV0ZSBhbiBpbnRlcmFjdGl2ZSBhbmQgc2hhcmVhYmxlIGRhc2hib2FyZCwgd2hpY2ggZGVwaWN0IHRoZSB0cmVuZHMsIHZhcmlhdGlvbnMsIGFuZCBkZW5zaXR5IG9mIHRoZSBkYXRhIGluIHRoZSBmb3JtIG9mIGdyYXBocyBhbmQgY2hhcnRzLiBUYWJsZWF1IGNhbiBjb25uZWN0IHRvIGZpbGVzLCByZWxhdGlvbmFsIGFuZCBCaWcgRGF0YSBzb3VyY2VzIHRvIGFjcXVpcmUgYW5kIHByb2Nlc3MgZGF0YS4gVGhlIHNvZnR3YXJlIGFsbG93cyBkYXRhIGJsZW5kaW5nIGFuZCByZWFsLXRpbWUgY29sbGFib3JhdGlvbiwgd2hpY2ggbWFrZXMgaXQgdmVyeSB1bmlxdWUuIEl0IGlzIHVzZWQgYnkgYnVzaW5lc3NlcywgYWNhZGVtaWMgcmVzZWFyY2hlcnMsIGFuZCBtYW55IGdvdmVybm1lbnQgb3JnYW5pemF0aW9ucyBmb3IgdmlzdWFsIGRhdGEgYW5hbHlzaXMuDQoNCg0KRGF0YSBhbmFseXNpcyBpcyB2ZXJ5IGZhc3Qgd2l0aCBUYWJsZWF1IGFuZCB0aGUgdmlzdWFsaXphdGlvbnMgY3JlYXRlZCBhcmUgaW4gdGhlIGZvcm0gb2YgZGFzaGJvYXJkcyBhbmQgd29ya3NoZWV0cy4gVGhlIGRhdGEgdGhhdCBpcyBjcmVhdGVkIHVzaW5nIFRhYmxlYXUgY2FuIGJlIHVuZGVyc3Rvb2QgYnkgcHJvZmVzc2lvbmFsIGF0IGFueSBsZXZlbCBpbiBhbiBvcmdhbml6YXRpb24uIEl0IGV2ZW4gYWxsb3dzIGEgbm9uLXRlY2huaWNhbCB1c2VyIHRvIGNyZWF0ZSBhIGN1c3RvbWl6ZWQgZGFzaGJvYXJkLg0KDQoNCl9fVGhlIGJlc3QgZmVhdHVyZSBUYWJsZWF1IGFyZTpfXw0KDQoqIERhdGEgQmxlbmRpbmcNCiogUmVhbCB0aW1lIGFuYWx5c2lzDQoqIENvbGxhYm9yYXRpb24gb2YgZGF0YQ0KDQoNCg0KVGhlIGdyZWF0IHRoaW5nIGFib3V0IFRhYmxlYXUgc29mdHdhcmUgaXMgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgYW55IHRlY2huaWNhbCBvciBhbnkga2luZCBvZiBwcm9ncmFtbWluZyBza2lsbHMgdG8gb3BlcmF0ZS4gVGhlIHRvb2wgaGFzIGdhcm5lcmVkIGludGVyZXN0IGFtb25nIHRoZSBwZW9wbGUgZnJvbSBhbGwgc2VjdG9ycyBzdWNoIGFzIGJ1c2luZXNzLCByZXNlYXJjaGVycywgZGlmZmVyZW50IGluZHVzdHJpZXMsIGV0Yy4NCg0KDQoNCl9fVGFibGVhdSBQcm9kdWN0IFN1aXRlX18NCg0KVGhlIFRhYmxlYXUgUHJvZHVjdCBTdWl0ZSBjb25zaXN0cyBvZg0KDQoqIFRhYmxlYXUgRGVza3RvcA0KKiBUYWJsZWF1IFB1YmxpYw0KKiBUYWJsZWF1IE9ubGluZQ0KKiBUYWJsZWF1IFNlcnZlcg0KKiBUYWJsZWF1IFJlYWRlcg0KDQohW10odGFibGVhdXByb2R1Y3QucG5nKQ0KDQoNCkZvciBjbGVhciB1bmRlcnN0YW5kaW5nLCBkYXRhIGFuYWx5dGljcyBpbiB0YWJsZWF1IGNhbiBiZSBjbGFzc2lmaWVkIGludG8gdHdvIGZ1Y250aW9uOg0KDQoxLiBEZXZlbG9wZXIgVG9vbHM6IFRoZSBUYWJsZWF1IHRvb2xzIHRoYXQgYXJlIHVzZWQgZm9yIGRldmVsb3BtZW50IHN1Y2ggYXMgdGhlIGNyZWF0aW9uIG9mIGRhc2hib2FyZHMsIGNoYXJ0cywgcmVwb3J0IGdlbmVyYXRpb24sIHZpc3VhbGl6YXRpb24gZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkuIFRoZSBUYWJsZWF1IHByb2R1Y3RzLCB1bmRlciB0aGlzIGNhdGVnb3J5LCBhcmUgdGhlIFRhYmxlYXUgRGVza3RvcCBhbmQgdGhlIFRhYmxlYXUgUHVibGljLg0KMi4gU2hhcmluZyBUb29sczogQXMgdGhlIG5hbWUgc3VnZ2VzdHMsIHRoZSBwdXJwb3NlIG9mIHRoZSB0b29sIGlzIHNoYXJpbmcgdGhlIHZpc3VhbGl6YXRpb25zLCByZXBvcnRzLCBkYXNoYm9hcmRzIHRoYXQgd2VyZSBjcmVhdGVkIHVzaW5nIHRoZSBkZXZlbG9wZXIgdG9vbHMuIFByb2R1Y3RzIHRoYXQgZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkgYXJlIFRhYmxlYXUgT25saW5lLCBTZXJ2ZXIsIGFuZCBSZWFkZXIuDQoNCg0KTGV0J3MgY29tcGFyZWQgYWxsIHRoZSBwcm9kdWN0cyBvbmUgYnkgb25lLg0KDQohW10ocHJvZHVjdHN1aXRlMS5wbmcpDQoNCg0KIVtdKHByb2R1Y3RzdWl0ZTIucG5nKQ0KDQoNCg0KX19Ib3cgZG9lcyBUYWJsZWF1IHdvcms/X18NCg0KKiBUYWJsZWF1IGNvbm5lY3RzIGFuZCBleHRyYWN0cyB0aGUgZGF0YSBzdG9yZWQgaW4gdmFyaW91cyBwbGFjZXMuIEl0IGNhbiBwdWxsIGRhdGEgZnJvbSBhbnkgcGxhdGZvcm0gaW1hZ2luYWJsZS4gQSBzaW1wbGUgZGF0YWJhc2Ugc3VjaCBhcyBhbiBleGNlbCwgcGRmLCB0byBhIGNvbXBsZXggZGF0YWJhc2UgbGlrZSBPcmFjbGUsIGEgZGF0YWJhc2UgaW4gdGhlIGNsb3VkIHN1Y2ggYXMgQW1hem9uIHdlYnMgc2VydmljZXMsIE1pY3Jvc29mdCBBenVyZSBTUUwgZGF0YWJhc2UsIEdvb2dsZSBDbG91ZCBTUUwgYW5kIHZhcmlvdXMgb3RoZXIgZGF0YSBzb3VyY2VzIGNhbiBiZSBleHRyYWN0ZWQgYnkgVGFibGVhdS4NCiogV2hlbiBUYWJsZWF1IGlzIGxhdW5jaGVkLCByZWFkeSBkYXRhIGNvbm5lY3RvcnMgYXJlIGF2YWlsYWJsZSB3aGljaCBhbGxvd3MgeW91IHRvIGNvbm5lY3QgdG8gYW55IGRhdGFiYXNlLiBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgVGFibGVhdSB0aGF0IHlvdSBoYXZlIHB1cmNoYXNlZCB0aGUgbnVtYmVyIG9mIGRhdGEgY29ubmVjdG9ycyBzdXBwb3J0ZWQgYnkgVGFibGVhdSB3aWxsIHZhcnkuDQoqIFRoZSBwdWxsZWQgZGF0YSBjYW4gYmUgZWl0aGVyIGNvbm5lY3RlZCBsaXZlIG9yIGV4dHJhY3RlZCB0byB0aGUgVGFibGVhdSdzIGRhdGEgZW5naW5lLCBUYWJsZWF1IERlc2t0b3AuIFRoaXMgaXMgd2hlcmUgdGhlIERhdGEgYW5hbHlzdCwgZGF0YSBlbmdpbmVlciB3b3JrIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgcHVsbGVkIHVwIGFuZCBkZXZlbG9wIHZpc3VhbGl6YXRpb25zLiBUaGUgY3JlYXRlZCBkYXNoYm9hcmRzIGFyZSBzaGFyZWQgd2l0aCB0aGUgdXNlcnMgYXMgYSBzdGF0aWMgZmlsZS4gVGhlIHVzZXJzIHdobyByZWNlaXZlIHRoZSBkYXNoYm9hcmRzIHZpZXdzIHRoZSBmaWxlIHVzaW5nIFRhYmxlYXUgUmVhZGVyLg0KKiBUaGUgZGF0YSBmcm9tIHRoZSBUYWJsZWF1IERlc2t0b3AgY2FuIGJlIHB1Ymxpc2hlZCB0byB0aGUgVGFibGVhdSBzZXJ2ZXIuIFRoaXMgaXMgYW4gZW50ZXJwcmlzZSBwbGF0Zm9ybSB3aGVyZSBjb2xsYWJvcmF0aW9uLCBkaXN0cmlidXRpb24sIGdvdmVybmFuY2UsIHNlY3VyaXR5IG1vZGVsLCBhdXRvbWF0aW9uIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQuIFdpdGggdGhlIFRhYmxlYXUgc2VydmVyLCB0aGUgZW5kIHVzZXJzIGhhdmUgYSBiZXR0ZXIgZXhwZXJpZW5jZSBpbiBhY2Nlc3NpbmcgdGhlIGZpbGVzIGZyb20gYWxsIGxvY2F0aW9ucyBiZSBpdCBhIGRlc2t0b3AsIG1vYmlsZSBvciBlbWFpbC4NCg0KDQohW10oaG93MS5qcGcpDQoNCiFbXShob3cyLnBuZykNCg0KDQoNCl9fRXhjZWwgVnMuIFRhYmxlYXVfXw0KDQpCb3RoIEV4Y2VsIGFuZCBUYWJsZWF1IGFyZSBkYXRhIGFuYWx5c2lzIHRvb2xzLCBidXQgZWFjaCB0b29sIGhhcyBpdHMgdW5pcXVlIGFwcHJvYWNoIHRvIGRhdGEgZXhwbG9yYXRpb24uIEhvd2V2ZXIsIHRoZSBhbmFseXNpcyBpbiBUYWJsZWF1IGlzIG1vcmUgcG90ZW50IHRoYW4gZXhjZWwuDQoNCg0KRXhjZWwgd29ya3Mgd2l0aCByb3dzIGFuZCBjb2x1bW5zIGluIHNwcmVhZHNoZWV0cyB3aGVyZWFzIFRhYmxlYXUgZW5hYmxlcyBpbiBleHBsb3JpbmcgZXhjZWwgZGF0YSB1c2luZyBpdHMgZHJhZyBhbmQgZHJvcCBmZWF0dXJlLiBUYWJsZWF1IGZvcm1hdHMgdGhlIGRhdGEgaW4gR3JhcGhzLCBwaWN0dXJlcyB0aGF0IGFyZSBlYXNpbHkgdW5kZXJzdGFuZGFibGUuDQoNClRvIGNvbmNsdWRlLCBUYWJsZWF1IGJlYXRzIEV4Y2VsIGluIG1ham9yIGFyZWFzIGxpa2UgdGhlIGludGVyYWN0aXZlIGRhc2hib2FyZHMsIHZpc3VhbGl6YXRpb25zLCBjYXBhYmlsaXRpZXMgdG8gd29yayB3aXRoIGxhcmdlLXNjYWxlIGRhdGEgYW5kIG1hbnkgbW9yZS4NCg0KIVtdKGV4Y2VsdnN0YWJsZWF1LmpwZykNCg0KDQoNCl9fVGFibGVhdSBQdWJsaWMgdnMgVGFibGVhdSBEZXNrdG9wX18NCg0KMS4gVGFibGVhdSBQdWJsaWMgKEZyZWUpDQoyLiBUYWJsZWF1IERlc2t0b3AgKENvbW1lcmNpYWwpDQoNClRhYmxlYXUgaXMgYXZhaWxhYmxlIGluIDIgdmVyc2lvbnMuIEhlcmUgaXMgYSBkZXRhaWxlZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIHR3bw0KDQohW10ocHVibGljdnNkZXNrdG9wLlBORykNCg0KDQoNCg0KIyAgSW5zdGFsbCBUYWJsZWF1IFB1YmxpYyAoRnJlZSkNCg0KX19TdGVwIDEpX18gR28gdG8gaHR0cHM6Ly9wdWJsaWMudGFibGVhdS5jb20vZW4tdXMvcy9kb3dubG9hZCBvbiB5b3VyIHdlYiBicm93c2VyLiBOb3cgeW91IG5lZWQgdG8gZW50ZXIgeW91ciBlbWFpbCBpZCBhbmQgY2xpY2sgb24gIkRPV05MT0FEIFRIRSBBUFAiIGJ1dHRvbi4NCg0KIVtdKGluc3RhbGwxLnBuZykNCg0KX19TdGVwIDIpX18gVGhpcyB3aWxsIHN0YXJ0IGRvd25sb2FkaW5nIHRoZSAuZXhlIGZpbGUgZm9yIFdpbmRvd3MgYnkgZGVmYXVsdCwgYW5kIHlvdSBjYW4gc2VlIHRoZSBkb3dubG9hZGluZyBwcm9jZXNzIGluIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgb2YgdGhlIHdlYnNpdGUuDQoNCiFbXShpbnN0YWxsMi5wbmcpDQoNCl9fU3RlcCAzKV9fIE9wZW4gdGhlIGRvd25sb2FkZWQgZmlsZS4gQWNjZXB0IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBhbmQgY2xpY2sgb24gIkluc3RhbGwiIGJ1dHRvbi4NCg0KIVtdKGluc3RhbGwzLnBuZykNCg0KX19TdGVwIDQpX18gQWZ0ZXIgaW5zdGFsbGF0aW9uIFN0YXJ0IFNjcmVlbiBvZiBUYWJsZWF1IGlzIHNob3duDQoNCiFbXShpbnN0YWxsNC5wbmcpDQoNCg0KPEJyPg0KDQoNCiMgSG93LXRvIFR1dG9yaWFsDQoNCl9fMS4gVGFibGVhdSBQdWJsaWMgT3ZlcnZpZXdfXw0KDQpMZWFybiB0aGUgYmFzaWNzIG9mIGNyZWF0aW5nIHZpc3VhbGl6YXRpb25zIHdpdGggVGFibGVhdSBQdWJsaWMuIA0KDQpDb3ZlcnM6DQoNCiogQ29ubmVjdGluZyB0byBkYXRhDQoqIENyZWF0aW5nIFNoZWV0cyBhbmQgRGFzaGJvYXJkcw0KKiBQdWJsaXNoaW5nIHRvIHRoZSB3ZWINCg0KDQpEYXRhOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KUmVzdWx0Og0KDQohW10ob3ZlcnZpZXcuUE5HKQ0KDQoNCg0KX18yLiBDb25uZWN0aW5nIHRvIEV4Y2VsIGFuZCBUZXh0IEZpbGVzX18NCg0KTGVhcm4gaG93IHRvIGNvbm5lY3QgdG8gZGF0YSBpbiBNaWNyb3NvZnQgRXhjZWwgYW5kIENTViBmaWxlcy4NCg0KQ292ZXJzOg0KDQoqIENvbm5lY3RpbmcgdG8gZGF0YSBpbiBFeGNlbA0KKiBDb25uZWN0aW5nIHRvIGRhdGEgaW4gQ1NWcw0KDQpFeGNlbCBEYXRhOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KQ1NWIERhdGE6IGh0dHBzOi8vc3VwcG9ydC5zcGF0aWFsa2V5LmNvbS9zcGF0aWFsa2V5LXNhbXBsZS1jc3YtZGF0YS8NCg0KDQoNClJlc3VsdDoNCg0KIVtdKGNvbm5lY3QuUE5HKQ0KDQo8QnI+DQoNCg0KIVtdKGNvbm5lY3QyLlBORykNCg0KDQoNCl9fMy4gQ29ubmVjdGluZyB0byBHb29nbGUgU2hlZXRzX18NCg0KU2VlIGhvdyB0byBjb25uZWN0IHRvIGRhdGEgaW4gR29vZ2xlIFNoZWV0cywgYW5kIGhvdyB0byBlbmFibGUgYXV0by11cGRhdGUgb24geW91ciB2aXouDQoNCkNvdmVyczoNCg0KKiBDb25uZWN0aW5nIHRvIGRhdGEgaW4gR29vZ2xlIFNoZWV0cw0KKiBFbmFibGluZyBHb29nbGUgU2hlZXRzIHZpeiBhdXRvLXVwZGF0ZQ0KDQpHb29nbGUgU2hlZXQgRGF0YTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMXd0eWFVQWVOMnp0U2ZBbzhTSzBGdFowbjg1SzBZQlBvX1pjSDZIeTU0TncvZWRpdD91c3A9c2hhcmluZw0KDQpSZXN1bHQ6DQoNCiFbXSh0YWJsZWF1Z29vZ2xlc2hlZXQuUE5HKQ0KDQoNCg0KX180LiBDb25uZWN0aW5nIHRvIFdlYiBEYXRhIENvbm5lY3RvcnNfXw0KDQpMZWFybiBob3cgdG8gY29ubmVjdCB0byBXZWIgRGF0YSBDb25uZWN0b3JzLg0KDQpDb3ZlcnM6DQoNCiogV2hhdCBhIFdlYiBEYXRhIENvbm5lY3RvciBpcw0KKiBIb3cgdG8gY29ubmVjdCB0byBXZWIgRGF0YSBDb25uZWN0b3JzDQoNCllvdSBjYW4gdXNlIGEgd2ViIGRhdGEgY29ubmVjdG9yIHRvIGNvbm5lY3QgdG8gZGF0YSB0aGF0IGlzIGFjY2Vzc2libGUgb3ZlciBIVFRQIGFuZCB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgY29ubmVjdG9yLiBBIHdlYiBkYXRhIGNvbm5lY3RvciBpcyBhbiBIVE1MIGZpbGUgdGhhdCBpbmNsdWRlcyBKYXZhU2NyaXB0IGNvZGUuIFlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHdlYiBkYXRhIGNvbm5lY3RvciBvciB1c2Ugb25lIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSBzb21lb25lIGVsc2UuIFRoZSB3ZWIgZGF0YSBjb25uZWN0b3IgbXVzdCBiZSBob3N0ZWQgb24gYSB3ZWIgc2VydmVyIHJ1bm5pbmcgbG9jYWxseSBvbiB5b3VyIGNvbXB1dGVyLCBvbiBhIHdlYiBzZXJ2ZXIgaW4geW91ciBkb21haW4sIG9yIG9uIGEgdGhpcmQtcGFydHkgd2ViIHNlcnZlci4NCg0KDQpTb3VyY2U6IGh0dHA6Ly90YWJsZWF1LmdpdGh1Yi5pby93ZWJkYXRhY29ubmVjdG9yLw0KDQpXREMgRGF0YTogaHR0cHM6Ly90YWJsZWF1LmdpdGh1Yi5pby93ZWJkYXRhY29ubmVjdG9yL0V4YW1wbGVzL2h0bWwvZWFydGhxdWFrZVVTR1MuaHRtbA0KDQpSZXN1bHQ6DQoNCiFbXShXREMuUE5HKQ0KDQoNCg0KX181LiBDb25uZWN0aW5nIHRvIFNwYXRpYWwgRmlsZXNfXw0KDQpTZWUgaG93IHRvIGJ1aWxkIG1hcHMgd2l0aCBzcGF0aWFsIGZpbGVzLg0KDQpDb3ZlcnM6DQoNCiogSG93IHRvIGNvbm5lY3QgdG8gc3BhdGlhbCBkYXRhLT4gWE1MIG9yIGdlb2pzb24NCiogQ3JlYXRlIGEgbWFwIHdpdGggYSBzcGF0aWFsIGZpbGUNCiogSG93IHRvIGpvaW4gb3RoZXIgZGF0YSBzZXRzIHRvIGEgc3BhdGlhbCBmaWxlDQoNCg0KRGF0YXNldDoNCg0KKiBTcGF0aWFsIERhdGEgd3JpYmFzaW4uc2hwOiBodHRwczovL2RhdGEuNHR1Lm5sL3JlcG9zaXRvcnkvdXVpZDo4Y2U5ZDIyYS05YWE0LTQxZWEtOTI5OS1mNDRlZmE5YzhiNzUNCiogU3BhdGlhbCBEYXRhIExvbmRvbl9Cb3JvdWdoX0V4Y2x1ZGluZ19NSFcuc2hwOiBodHRwczovL2dpdGh1Yi5jb20vbWFjem9rbmkvY3JpbWVNYXBUZXN0L2Jsb2IvbWFzdGVyL0xvbmRvbl9Cb3JvdWdoX0V4Y2x1ZGluZ19NSFcuc2hwDQoqIGNhcmJvbi1lbWlzc2lvbnMtYm9yb3VnaC54bHM6IGh0dHBzOi8vb2xkLmRhdGFodWIuaW8vZGF0YXNldC9jYXJib24tZGlveGlkZS1lbWlzc2lvbnMtYm9yb3VnaA0KDQoNClN0ZXAgYnkgc3RlcDoNCg0KMS4gYENob29zZSB0aGUgd3JpYmFzaW4uc2hwYA0KMi4gYENob29zZSB0aGUgTG9uZG9uX0Jvcm91Z2hfRXhjbHVkaW5nX01IVy5zaHBgPFtHU1MgQ29kZV0tW0NvZGVdPmBjYXJib24tZW1pc3Npb25zLWJvcm91Z2gueGx4YA0KDQpSZXN1bHQ6DQoNCiFbXShTcGF0aWFsIEZpbGUuUE5HKQ0KDQo8QnI+DQoNCiFbXShzcGF0aWFsIGZpbGUgMi5QTkcpDQoNCg0KDQpfXzYuIENvbm5lY3RpbmcgdG8gUERGc19fDQoNCkxlYXJuIGhvdyB0byBjb25uZWN0IHRvIGRhdGEgaW4gUERGcyBkaXJlY3RseSBpbiBUYWJsZWF1Lg0KDQpDb3ZlcnM6DQoNCiogQ29ubmVjdGluZyB0byBQREYgZGF0YSB0YWJsZXMNCiogVW5pb24NCiogQ2xlYW5pbmcgdXAgaW1wZXJmZWN0IHRhYmxlcw0KKiBEZWFsaW5nIHdpdGggbnVsbCB2YWx1ZXMNCiogRml4aW5nIGhlYWRlcnMgYW5kIHBpdm90aW5nDQoqIFJlLWFsaWFzaW5nIG1lbWJlcnMgb2YgYSBmaWVsZA0KKiBSZWNyZWF0aW5nIEdyb3VwcyBhbmQgSGllcmFyY2hpZXMNCiogVGlwcyBvbiB3b3JraW5nIHdpdGggUERGcw0KDQpEYXRhc2V0Og0KDQoxLiBBbWF6b24gU3RvY2sgUHJpY2VzOiBodHRwczovL3B1YmxpYy50YWJsZWF1LmNvbS9zL3NpdGVzL2RlZmF1bHQvZmlsZXMvbWVkaWEvYW16bl9zdG9jay5wZGYNCg0KMi4gTmV3IFplYWxhbmQgV2F0ZXIgUGh5c2ljYWwgU3RvY2sgQWNjb3VudDogaHR0cHM6Ly9wdWJsaWMudGFibGVhdS5jb20vcy9zaXRlcy9kZWZhdWx0L2ZpbGVzL21lZGlhL256X3dhdGVyXzAucGRmDQoNCg0KUmVzdWx0Og0KDQohW10ocGRmLnBuZykNCg0KDQpfXzcuIERhdGEgUHJlcGFyYXRpb24g4oCTIFRoZSBEYXRhIEludGVycHJldGVyX18NCg0KU2VlIFRhYmxlYXUgUHVibGlj4oCZcyBpZGVhbCBkYXRhIHN0cnVjdHVyZSwgYW5kIGxlYXJuIGhvdyB0byB1c2UgdGhlIERhdGEgSW50ZXJwcmV0ZXIgdG8gY2xlYW4gZGF0YS4NCg0KQ292ZXJzOg0KDQoqIEhvdyB5b3VyIGRhdGEgc2hvdWxkIChpZGVhbGx5KSBiZSBzdHJ1Y3R1cmVkDQoqIEhvdyB0byBjbGVhbiB5b3VyIGRhdGEgdXNpbmcgdGhlIERhdGEgSW50ZXJwcmV0ZXINCg0KDQpEYXRhOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KUmVzdWx0Og0KDQohW10oaW50ZXJwcmV0ZXIucG5nKQ0KDQoNCg0KX184LiBEYXRhIFByZXBhcmF0aW9uIOKAkyBQaXZvdGluZyB5b3VyIERhdGFfXw0KDQoNCkxlYXJuIGhvdyB0byBwaXZvdCB5b3VyIGRhdGEgc3RydWN0dXJlIGluIFRhYmxlYXUuDQoNCg0KQ292ZXJzOg0KDQoNCiogV2h5IHlvdSBtaWdodCBuZWVkIHRvIHBpdm90IHlvdXIgZGF0YSBzdHJ1Y3R1cmUNCiogSG93IHRvIHVzZSBUYWJsZWF1IFB1YmxpY+KAmXMgcGl2b3QgZnVuY3Rpb24NCg0KDQpEYXRhOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KDQpSZXN1bHQ6DQoNCiFbXShwaXZvdC5QTkcpDQoNCg0KDQo8QnI+DQoNCiFbXShwaXZvdDIuUE5HKQ0KDQoNCl9fOS4gRGF0YSBQcmVwYXJhdGlvbiDigJMgU3BsaXR0aW5nIHlvdXIgRGF0YV9fDQoNCkxlYXJuIGhvdyB0byBzcGxpdCBhIGZpZWxkIGludG8gbXVsdGlwbGUgZmllbGRzIGluIFRhYmxlYXUNCg0KQ292ZXJzOg0KDQoqIFdoeSB5b3UgbWlnaHQgbmVlZCB0byBzcGxpdCBhIGZpZWxkIGluIFRhYmxlYXUgUHVibGljDQoqIEhvdyB0byB1c2UgVGFibGVhdSBQdWJsaWPigJlzIHNwbGl0IGZ1bmN0aW9uDQoNCkRhdGE6IGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQw0KDQpSZXN1bHQ6DQoNCiFbXShzcGxpdC5QTkcpDQoNCg0KDQpfXzEwLiBEYXRhIFByZXBhcmF0aW9uIOKAkyBKb2lucyBhbmQgVW5pb25zX18NCg0KTGVhcm4gaG93IHRvIGpvaW4gbXVsdGlwbGUgZGF0YSBzZXRzIHRvZ2V0aGVyIGluIFRhYmxlYXUuDQoNCkNvdmVyczoNCg0KKiBXaGF0IGFyZSBqb2lucyBhbmQgdW5pb25zDQoqIEhvdyB0byBqb2luIHR3byBkYXRhIHNldHMgdG9nZXRoZXINCiogSG93IHRvIHVuaW9uIG11bHRpcGxlIGRhdGEgc2V0cw0KDQpEYXRhOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KUmVzdWx0Og0KDQohW10oam9pbi5QTkcpDQoNCjxCcj4NCg0KIVtdKHVuaW9uLlBORykNCg0KDQpfXzExLiBDcmVhdGluZyBZb3VyIEZpcnN0IENoYXJ0X18NCg0KRmluZCBvdXQgaG93IHRvIGNyZWF0ZSB5b3VyIGZpcnN0IGNoYXJ0IGluIFRhYmxlYXUgUHVibGljLg0KDQpDb3ZlcnM6DQoNCiogSG93IHRvIGNyZWF0ZSBhIGNoYXJ0IGJ5IGRvdWJsZSBjbGlja2luZyBvbiBmaWVsZHMNCiogSG93IHRvIGFkZCBleHRyYSBsZXZlbHMgb2YgaW5mb3JtYXRpb24gdG8geW91ciB2aXoNCg0KRGF0YTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDDQoNClJlc3VsdDoNCg0KIVtdKGZpcnN0Y2hhcnQuUE5HKQ0KDQoNCg0KDQpfXzEyLiBVc2luZyB0aGUgU2hvdyBNZSBUb29sIEJhcl9fDQoNCg0KRmluZCBvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aXBsZSB2aXN1YWxpemF0aW9uIHR5cGVzIHVzaW5nIHRoZSBTaG93IE1lIFRvb2wgQmFyLg0KDQoNCkNvdmVyczoNCg0KKiBUaGUgU2hvdyBNZSB0b29sDQoqIE92ZXJ2aWV3IG9mIENoYXJ0IHR5cGVzDQoNCkRhdGE6IGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQw0KDQpSZXN1bHQ6DQoNCiFbXShzaG93bWUuUE5HKQ0KDQoNCl9fMTMuIFVuZGVyc3RhbmRpbmcgdGhlIExvZ2ljIG9mIENoYXJ0c19fDQoNCkxlYXJuIGFib3V0IHRoZSBsb2dpYyBvZiBob3cgVGFibGVhdSBQdWJsaWMgY3JlYXRlcyBjaGFydHMuDQoNCkNvdmVyczoNCg0KKiBPdmVydmlldyBvZiBEaW1lbnNpb25zIGFuZCBNZWFzdXJlcw0KKiBPdmVydmlldyBvZiBDb2x1bW5zIGFuZCBSb3dzIHNoZWxmDQoqIE92ZXJ2aWV3IG9mIHRoZSBNYXJrcyBjYXJkDQoNCkRhdGE6IGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQw0KDQoNClJlc3VsdDoNCg0KDQohW10oY2hhcnRsb2dpYy5wbmcpDQoNCg0KX18xNC4gQ29tYmluaW5nIFNoZWV0cyBvbiBhIERhc2hib2FyZF9fDQoNClNlZSBob3cgdG8gY29tYmluZSB5b3VyIHZpc3VhbGl6YXRpb25zIHRvZ2V0aGVyIG9uIGEgZGFzaGJvYXJkLg0KDQpDb3ZlcnM6DQoNCiogSG93IHRvIGNvbWJpbmUgc2hlZXRzIG9uIGEgZGFzaGJvYXJkDQoqIEhvdyB0byByZS1hcnJhbmdlIGFuZCBhZGQgaXRlbXMgdG8gYSBkYXNoYm9hcmQNCg0KRGF0YTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDDQoNClJlc3VsdDoNCg0KIVtdKGVtaXNzaW9ucy5QTkcpDQoNCg0KDQpfXzE1LiBBZGRpbmcgSW50ZXJhY3Rpdml0eSB0byBEYXNoYm9hcmRzX18NCg0KTGVhcm4gaG93IHRvIGFkZCBpbnRlcmFjdGl2aXR5IHRvIHlvdXIgZGFzaGJvYXJkcy4NCg0KQ292ZXJzOg0KDQoqIFNlZSBob3cgdG8gYWRkIGZpbHRlciBhY3Rpb25zDQoqIFNlZSBob3cgdG8gYWRkIGhpZ2hsaWdodCBhY3Rpb25zDQoNCkRhdGE6ICBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KDQpSZXN1bHQ6DQoNCiFbXShmaWx0ZXIuUE5HKQ0KDQoNCl9fMTYuIERhc2hib2FyZCBGb3JtYXR0aW5nX18NCg0KTWFrZSB5b3VyIGRhc2hib2FyZHMgZnVuY3Rpb25hbCBhbmQgbG9vayBmYW50YXN0aWMgd2l0aCB0aGVzZSBmb3JtYXR0aW5nIHRpcHMuDQoNCkNvdmVyczoNCg0KKiBTZWUgaG93IHRvIHF1aWNrbHkgZ2xvYmFsbHkgZm9ybWF0IHlvdXIgZGFzaGJvYXJkcw0KKiBUaXBzIHRvIGFkZCB0aXRsZXMgYW5kIGluc3RydWN0aW9ucyB0byB5b3VyIGRhc2hib2FyZA0KDQpEYXRhOiAgaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDDQoNCg0KUmVzdWx0Og0KDQohW10oZm9ybWF0dGluZy5QTkcpDQoNCg0KDQpfXzE3LiBDcmVhdGluZyBTdG9yaWVzX18NCg0KTGVhcm4gaG93IHRvIHR1cm4geW91ciBkYXRhIGludG8gYSBjb2hlc2l2ZSBuYXJyYXRpdmUgdXNpbmcgU3RvcnkgUG9pbnRzLg0KDQpDb3ZlcnM6DQoNCiogU2VlIGV4YW1wbGVzIG9mIGRhdGEgc3Rvcmllcw0KKiBMZWFybiBob3cgdG8gY3JlYXRlIHN0b3J5IHBvaW50cw0KDQoNCkRhdGE6ICBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KDQpSZXN1bHQ6DQoNCiFbXShzdG9yeS5QTkcpDQoNCg0KDQpfXzE4LiBGb3JtYXR0aW5nIFN0b3J5IFBvaW50c19fDQoNCk1ha2UgeW91ciBzdG9yaWVzIGNvbWUgdG8gbGlmZSB3aXRoIHRoZXNlIGZvcm1hdHRpbmcgdGlwcy4NCg0KQ292ZXJzOg0KDQoqIExlYXJuIGhvdyB0byBmaXQgeW91ciBkYXNoYm9hcmRzIHRvIHRoZSBzdG9yeSBwb2ludHMNCiogU2VlIGhvdyB0byBmb3JtYXQgdGhlIHN0b3J5IHBvaW50cw0KKiBTZWUgaG93IHRvIGFkZCBhbm5vdGF0aW9ucyB0byB5b3VyIHN0b3J5DQoNCg0KRGF0YTogIGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQw0KDQoNClJlc3VsdDoNCg0KIVtdKHN0b3J5Zm9ybWF0dC5QTkcpDQoNCg0KDQoNCl9fMTkuIERlc2lnbmluZyBmb3IgTW9iaWxlIHdpdGggdGhlIERldmljZSBEZXNpZ25lcl9fDQoNCkxlYXJuIGhvdyB0byBtYWtlIHlvdXIgdml6IGxvb2sgZ3JlYXQgb24gYW55IGRldmljZSB3aXRoIHRoZSBEZXZpY2UgRGVzaWduZXIgZmVhdHVyZS4NCg0KQ292ZXJzOg0KDQoqIFByZXZpZXcgaG93IHlvdXIgdml6IHdpbGwgbG9vayBvbiBtdWx0aXBsZSBkZXZpY2VzDQoqIEhvdyB0byBhZGQgYSBkZXZpY2Ugc3BlY2lmaWMgdmlldw0KKiBUaXBzIG9uIGZpdHRpbmcgeW91ciB2aXogdG8gZGV2aWNlIHNpemVzDQoNCkRhdGE6ICBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KDQpSZXN1bHQ6DQoNCiFbXShkZXZpY2VwcmV2aWV3LlBORykNCg0KDQoNCl9fMjAuIFB1Ymxpc2hpbmcgYW5kIEVtYmVkZGluZyBWaXp6ZXNfXw0KDQpPbmNlIHlvdSBoYXZlIG1hZGUgeW91ciB2aXosIHNlZSBob3cgeW91IGNhbiBzaGFyZSBpdC4NCg0KQ292ZXJzOg0KDQoqIEhvdyB0byBzYXZlIGEgdml6IHRvIHRoZSB3ZWINCiogRWRpdCB5b3VyIHZpeiBkZXRhaWxzDQoqIEhvdyB0byB1c2UgdGhlIHZpeiBVUkwgYW5kIGVtYmVkIGNvZGVzDQoNCkRhdGE6ICBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMNCg0KDQpSZXN1bHQ6DQoNCg0KIVtdKHNhdmVhcy5QTkcpDQoNCg0KDQpfXzIxLiBBZGRpbmcgYSBjdXN0b20gVml6IGluIFRvb2x0aXBfXw0KDQoNCkxlYXJuIGhvdyB0byBzaG93IGEgZGlmZmVyZW50IGxldmVsIG9mIGRldGFpbCB3aXRoIHRoZSBWaXogaW4gVG9vbHRpcCBmZWF0dXJlLg0KDQpDb3ZlcnM6DQoNCiogSG93IHRvIGNyZWF0ZSBhIHZpeiBpbiB0b29sdGlwDQoqIFJlc2l6aW5nIHlvdXIgdml6IGluIHRvb2x0aXANCg0KDQpEYXRhOiAgaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDDQoNCg0KUmVzdWx0Og0KDQohW10odG9vbHRpcC5wbmcpDQoNCg0KDQpfXzIyLiBFZGl0IFZpenplcyBvbiB0aGUgV2ViX18NCg0KT25jZSB5b3UgaGF2ZSBzYXZlZCBhIHZpeiB0byB5b3VyIHByb2ZpbGUsIHNlZSBob3cgeW91IGNhbiBlZGl0IGZyb20geW91ciBicm93c2VyLg0KDQpDb3ZlcnM6DQoNCiogQ3JlYXRlIGEgbmV3IHNoZWV0IGZyb20gYSBicm93c2VyDQoqIENyZWF0ZSBhIGNhbGN1bGF0ZWQgZmllbGQgZnJvbSBhIGJyb3dzZXINCiogRWRpdCBhIGRhc2hib2FyZCBmcm9tIHlvdXIgYnJvd3Nlcg0KDQpEYXRhOiAgaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDDQoNCg0KUmVzdWx0Og0KDQohW10oZWRpdC5QTkcpDQoNCg0KDQo8QnI+DQoNCiMgQ2hhbmdlIGxvZyB1cGRhdGUNCg0KKiAwNy4xMC4yMDE5DQoqIDA4LjEwLjIwMTkNCiogMDkuMTAuMjAxOQ0KKiAxMC4xMC4yMDE5DQoNCg0KDQoNCg0KPEJyPg0KDQojIFByZWZlcmVuY2VzDQoNCiogW0F1dGhvcmluZyBCb29rcyBhbmQgVGVjaG5pY2FsIERvY3VtZW50cyB3aXRoIFIgTWFya2Rvd25dKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duLykNCiogW1IgTWFya2Rvd246IFRoZSBEZWZpbml0aXZlIEd1aWRlXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vKQ0KKiBbR3VydTk5OiBUYWJsZWF1XShodHRwczovL3d3dy5ndXJ1OTkuY29tLykNCiogW1R1dG9yaWFsc3BvaW50OiBUYWJsZWF1XShodHRwczovL3d3dy50dXRvcmlhbHNwb2ludC5jb20vaW5kZXguaHRtKQ0KKiBbVGFibGVhdSBMZWFybmluZyBQYXRoOiBBbmFseXRpY3NWaWRoeWFdKGh0dHBzOi8vd3d3LmFuYWx5dGljc3ZpZGh5YS5jb20vbXlmZWVkLz91dG0tc291cmNlPWJsb2cmdXRtLW1lZGl1bT10b3AtaWNvbiUyRikNCiogW0p1bXBzdGFydCBUYWJsZWF1XShodHRwczovL3d3dy5hbWF6b24uY29tL0p1bXBzdGFydC1UYWJsZWF1LVN0ZXAtU3RlcC1WaXN1YWxpemF0aW9uL2RwLzE0ODQyMTkzMzMpDQoqIFtQcm8gVGFibGVhdV0oaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9Qcm8tVGFibGVhdS1TdGVwLVN0ZXAtR3VpZGUvZHAvMTQ4NDIyMzUxOS9yZWY9c3JfMV8xP19fbWtfZGVfREU9JUMzJTg1TSVDMyU4NSVDNSVCRCVDMyU5NSVDMyU5MSZrZXl3b3Jkcz1Qcm8rdGFibGVhdSZxaWQ9MTU3MDQ0NjY3NCZzPWJvb2tzJnNyPTEtMSkNCiogW1JhcGlkIEdyYXBocyB3aXRoIFRhYmxlYXVdKGh0dHBzOi8vd3d3LmViYXkuY29tL2l0bS9SYXBpZC1HcmFwaHMtd2l0aC1UYWJsZWF1LTgtVGhlLU9yaWdpbmFsLUd1aWRlLWZvci10aGUtQWNjaWRlbnRhbC1Bbi0vMjczNjg5MDg5MDcwKQ0KKiBbVGFibGVhdSBDb29rYm9va10oaHR0cHM6Ly93d3cuYW1hem9uLmNvbS9UYWJsZWF1LTEwLUJ1c2luZXNzLUludGVsbGlnZW5jZS1Db29rYm9vay9kcC8xNzg2NDY1NjM5L3JlZj1zcl8xXzI/X19ta19kZV9ERT0lQzMlODVNJUMzJTg1JUM1JUJEJUMzJTk1JUMzJTkxJmtleXdvcmRzPXRhYmxlYXUrY29va2Jvb2smcWlkPTE1NzA0NjAxODkmcz1ib29rcyZzcj0xLTIpDQoqIFtUYWJsZWF1IFlvdXIgRGF0YSFdKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vVGFibGVhdS1Zb3VyLURhdGEtQW5hbHlzaXMtU29mdHdhcmUvZHAvMTExODYxMjA0MykNCiogW1RhYmxlYXUgRGFzaGJvYXJkIENvb2tib29rXShodHRwczovL3d3dy5hbWF6b24uY29tL1RhYmxlYXUtRGFzaGJvYXJkLUNvb2tib29rLUplbi1TdGlycnVwL2RwLzE3ODIxNzc5MDYpDQoqIFtUYWJsZWF1IFZpc3VhbCBHdWlkZWJvb2tdKGh0dHBzOi8vd3d3LnRhYmxlYXUuY29tL3Zpc3VhbC1ndWlkZWJvb2stZmxvd2luZ2RhdGEpDQoqIFtUYWJsZWF1IFdoaXRlcGFwZXJzXShodHRwczovL3d3dy50YWJsZWF1LmNvbS9sZWFybi93aGl0ZXBhcGVycykNCiogW1RhYmxlYXUgUHVibGljIFJlc291cmNlc10oaHR0cHM6Ly9wdWJsaWMudGFibGVhdS5jb20vZW4tdXMvcy9yZXNvdXJjZXMpDQoqIFtPbkxpbmUgQW5hbHl0aWNhbCBQcm9jZXNzaW5nXShodHRwczovL29sYXAuY29tLykNCiogW0RhdGF3YXJlaG91c2UgZm9yIFlvdV0oaHR0cHM6Ly93d3cuZGF0YXdhcmVob3VzZTR1LmluZm8vKQ0KKiBbWW91dHViZSBUYWJsZWF1IFZpZGVvc10oeW91dHViZS5jb20pDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PW80SWZUQm15dG9NJmxpc3Q9UExoQlhPT2VzOTA5aUFScmYyNXF0bmhQLXJBQmtPSXRoMg0KICAgICogaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xQkx5d0xyUVVjRSZsaXN0PVBMeUQxWENJUkEzZ1FtTjczZEh3UVdyNFIwOEFCWkZNdFoNCiAgICAqIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9akpHTlotNi12WW8mbGlzdD1QTDdDV0JEUlpaX1Fkd293RGZVSjFwRDZ0OEltV09qT21JDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTM4b2Rxd1l4YUhnJmxpc3Q9UExfSDhTRWNmVEFYa196NGtvNUZsYkR5U1YtaDRnZEhyQQ0KICAgICogaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1teWRzMmVKOWJVVSZsaXN0PVBMX3F4NjhEd2hZQV9ZeVFjMnFsZUhwNm5sNEs1UEItUGINCiAgICAqIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UVlua3VkQ3hibUUmbGlzdD1QTDZfRDlVU1drRzFEa3ZjbEdmc0ZuSm5vNWJfckR2QXJLDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWZPN2cwcG5XYVJBJmxpc3Q9UExFaUVBcTJWa1VVSkV2cnNleTI2UC1CajRWazZCTEJWQw0KICAgICogaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1nV1p0TmRNa28xayZsaXN0PVBMV1Bpcmg0RVdGcEdYVEJ1OGxkTFpHSkNVZVRNQnBKRksNCiAgICAqIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9amo2LTBjdmNORUEmbGlzdD1QTDlvb1ZyUDFoUU9IN25pMTN3Nzc2elBfWDlueTNFa3N2DQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWFIYU9JdlIwMFNvDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVRQTWxaeFJSYUJRDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXpOUEVzaThNamRJDQogICAgKiBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PVBMVkhnUWt1OFo5MzRLUFgtTlh3V1F6eGY4ZUNyNXZzY0kNCiAgICAqIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9UExfcXg2OER3aFlBX1l5UWMycWxlSHA2bmw0SzVQQi1QYg0KKiBbUGludGVyZXN0XShodHRwczovL3d3dy5waW50ZXJlc3QuY29tL3Bpbi85Njg5NzgyOTQ2MjU4NTkxNi8pDQoqIFtSb29zYm9hcmRdKGh0dHBzOi8vcm9vc2JvYXJkLmNvbS9ibG9nL3doYXQtZGlmZnJlbmNlLWJldHdlZW4tc2VsZi1hbmQtdHJhZGl0aW9uYWwtQkkuaHRtbCkNCiogW0VkdUNCQV0oaHR0cHM6Ly93d3cuZWR1Y2JhLmNvbS9leGNlbC12cy10YWJsZWF1LykNCg0KPEJyPg0KDQojIExpY2Vuc2UNCg0KW01JVF0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQp